package util

func Crc16Modbus(data []byte) (low byte, high byte) {
	sum := uint16(0xFFFF)
	for _, v := range data {
		sum ^= uint16(v)
		for i := 0; i < 8; i++ {
			if 0 != (sum & 0x1) {
				sum = (sum >> 1) ^ 0xA001
			} else {
				sum = 0x7FFF & (sum >> 1)
			}
		}

	}
	low = byte(sum & 0xFF)
	high = byte((sum >> 8) & 0xFF)
	return low, high
}

func CheckModbusCRC16(data []byte) bool {
	len := len(data)
	l, h := Crc16Modbus(data[:len-2])
	if l == data[len-2] && h == data[len-1] {
		return true
	}
	return false
}

// addModebusCRC16 把数据后两位改为CRC校验码
func AddModebusCRC16(data []byte) []byte {
	len := len(data)
	l, h := Crc16Modbus(data[:len-2])
	data[len-2] = l
	data[len-1] = h
	return data
}

// 将无符号数转为有符号数
func TransData(dat uint16) int16 {
	if 0x8000&dat == 0x8000 { //dat 最高为1
		dat = dat & 0x7FFF
		dat = (^dat & 0x7FFF) + 1
		return int16(-dat)
	}
	return int16(dat)
}
